home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Caml Light 0.61 / Source / src / lib / random.ml < prev    next >
Encoding:
Text File  |  1993-09-24  |  1.3 KB  |  44 lines  |  [TEXT/MPS ]

  1. (* "Linear feedback shift register" random number generator. *)
  2. (* References: Robert Sedgewick, "Algorithms", Addison-Wesley *)
  3.  
  4. #open "float";;
  5. #open "int";;
  6. #open "eq";;
  7. #open "ref";;
  8. #open "fvect";;
  9.  
  10. (* This is the state you get with [init 27182818]. *)
  11. let state = [|
  12.   27182818; 49616251; -713408192; -773140415; 184774990;
  13.   -742824713; 1034277516; -122742499; -379589510; 184143411;
  14.   433271448; 112550329; -901847962; 938020143; 345894244;
  15.   927712789; -1025522414; -865624597; -403419408; 796140081;
  16.   119716478; 251640935; 786654012; 222302733; -113987414;
  17.   245458083; -836569528; 518844841; 1039881110; -736210273;
  18.   -10382316; -574628603; -1035923646; -848952741; -883914592;
  19.   144814113; -593424466; 780251095; -26222612; -92600579;
  20.   -130858790; -1001367789; -459643400; 407911833; -201830714;
  21.   -184372209; -682514748;-216174603; 587572594; -363380021;
  22.   -355865008; -109938159; 426864862; 563494727; -977909604
  23. |];;
  24.  
  25. let j = ref 0;;
  26.  
  27. let init seed =
  28.   j := 0;
  29.   state.(0) <- seed;
  30.   for i = 1 to 54
  31.   do state.(i) <- state.(i-1) * 31415821 + 1
  32.   done
  33. ;;
  34.  
  35. let raw () =
  36.   j := (!j + 1) mod 55;
  37.   state.(!j) <- state.((!j+24) mod 55) lxor state.(!j);
  38.   state.(!j) land 0x3FFFFFFF
  39. ;;
  40.  
  41. let int bound = raw () mod bound;;
  42.  
  43. let float bound = float_of_int (raw ()) /. 1073741824.0 *. bound;;
  44.